home *** CD-ROM | disk | FTP | other *** search
/ Personal Computer World 2009 February / PCWFEB09.iso / Software / Freeware / Griffith 0.9.8 / griffith-0.9.8-win32.exe / {app} / lib / add.py < prev    next >
Text File  |  2008-11-17  |  27KB  |  729 lines

  1. # -*- coding: UTF-8 -*-
  2.  
  3. __revision__ = '$Id: add.py 1040 2008-11-15 21:13:49Z mikej06 $'
  4.  
  5. # Copyright (c) 2005-2008 Vasco Nunes, Piotr O┼╝arowski
  6. #
  7. # This program is free software; you can redistribute it and/or modify
  8. # it under the terms of the GNU General Public License as published byp
  9. # the Free Software Foundation; either version 2 of the License, or
  10. # (at your option) any later version.
  11. #
  12. # This program is distributed in the hope that it will be useful,
  13. # but WITHOUT ANY WARRANTY; without even the implied warranty of
  14. # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  15. # GNU Library General Public License for more details.
  16. #
  17. # You should have received a copy of the GNU General Public License
  18. # along with this program; if not, write to the Free Software
  19. # 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA
  20.  
  21. # You may use and distribute this software under the terms of the
  22. # GNU General Public License, version 2 or later
  23.  
  24. import gutils
  25. import os
  26. import gtk
  27. import string
  28. import shutil
  29. import quick_filter
  30.  
  31. def clear(self):
  32.     """clears all fields in dialog"""
  33.     set_details(self, {})
  34.     self.widgets['add']['cb_only_empty'].set_active(False)
  35.  
  36. def add_movie(self, details={}):
  37.     set_details(self, details)
  38.     
  39.     self.active_plugin = ''
  40.     self.widgets['add']['add_button'].show()
  41.     self.widgets['add']['add_close_button'].show()
  42.     self.widgets['add']['clear_button'].show()
  43.     self.widgets['add']['save_button'].hide()
  44.     self.widgets['add']['window'].set_title(_('Add a new movie'))
  45.     self.widgets['add']['window'].show()
  46.  
  47. def edit_movie(self, details={}):
  48.     if not details.has_key('number'):
  49.         details['number'] = gutils.find_next_available(self.db)
  50.     set_details(self, details)
  51.     self.widgets['add']['add_button'].hide()
  52.     self.widgets['add']['add_close_button'].hide()
  53.     self.widgets['add']['clear_button'].hide()
  54.     self.widgets['add']['save_button'].show()
  55.     self.widgets['add']['window'].set_title(_('Edit movie'))
  56.     self.widgets['add']['window'].show()
  57.  
  58. def set_details(self, item=None):#{{{
  59.     if item is None:
  60.         item = {}
  61.     if item.has_key('movie_id') and item['movie_id']:
  62.         self._am_movie_id = item['movie_id']
  63.     else:
  64.         self._am_movie_id = None
  65.     w = self.widgets['add']
  66.  
  67.     cast_buffer  = w['cast'].get_buffer()
  68.     notes_buffer = w['notes'].get_buffer()
  69.     plot_buffer  = w['plot'].get_buffer()
  70.  
  71.     if item.has_key('o_title') and item['o_title']:
  72.         w['o_title'].set_text(item['o_title'])
  73.     else:
  74.         w['o_title'].set_text('')
  75.     if item.has_key('title') and item['title']:
  76.         w['title'].set_text(item['title'])
  77.     else:
  78.         w['title'].set_text('')
  79.     if item.has_key('number') and item['number']:
  80.         w['number'].set_value(int(item['number']))
  81.     else:
  82.         w['number'].set_value(int(gutils.find_next_available(self.db)))
  83.     if item.has_key('title') and item['title']:
  84.         w['title'].set_text(item['title'])
  85.     if item.has_key('year') and item['year']:
  86.         w['year'].set_value( gutils.digits_only(item['year'], 2100))
  87.     else:
  88.         w['year'].set_value(0)
  89.     if item.has_key('runtime') and item['runtime']:
  90.         w['runtime'].set_value( gutils.digits_only(item['runtime']))
  91.     else:
  92.         w['runtime'].set_value(0)
  93.     if item.has_key('country') and item['country']:
  94.         w['country'].set_text(item['country'])
  95.     else:
  96.         w['country'].set_text('')
  97.     if item.has_key('classification') and item['classification']:
  98.         w['classification'].set_text(item['classification'])
  99.     else:
  100.         w['classification'].set_text('')
  101.     if item.has_key('studio') and item['studio']:
  102.         w['studio'].set_text(item['studio'])
  103.     else:
  104.         w['studio'].set_text('')
  105.     if item.has_key('o_site') and item['o_site']:
  106.         w['o_site'].set_text(item['o_site'])
  107.     else:
  108.         w['o_site'].set_text('')
  109.     if item.has_key('director') and item['director']:
  110.         w['director'].set_text(item['director'])
  111.     else:
  112.         w['director'].set_text('')
  113.     if item.has_key('site') and item['site']:
  114.         w['site'].set_text(item['site'])
  115.     else:
  116.         w['site'].set_text('')
  117.     if item.has_key('trailer') and item['trailer']:
  118.         w['trailer'].set_text(item['trailer'])
  119.     else:
  120.         w['trailer'].set_text('')
  121.     if item.has_key('title') and item['title']:
  122.         w['title'].set_text(item['title'])
  123.     else:
  124.         w['title'].set_text('')
  125.     if item.has_key('genre') and item['genre']:
  126.         w['genre'].set_text(item['genre'])
  127.     else:
  128.         w['genre'].set_text('')
  129.     if item.has_key('color') and item['color']:
  130.         w['color'].set_active( gutils.digits_only(item['color'], 3))
  131.     else:
  132.         w['color'].set_active( gutils.digits_only(self.config.get('color', 0, section='defaults'), 3))
  133.     if item.has_key('layers') and item['layers']:
  134.         w['layers'].set_active( gutils.digits_only(item['layers'], 4))
  135.     else:
  136.         w['layers'].set_active( gutils.digits_only(self.config.get('layers', 0, section='defaults'), 4))
  137.     if item.has_key('region') and item['region']>=0:
  138.             w['region'].set_active( gutils.digits_only(item['region'], 8))
  139.     else:
  140.         w['region'].set_active( gutils.digits_only(self.config.get('region', 0, section='defaults'), 8))
  141.     if item.has_key('cond') and item['cond']>=0:
  142.         w['condition'].set_active( gutils.digits_only( item['cond'], 5) )
  143.     else:
  144.         w['condition'].set_active( gutils.digits_only( self.config.get('condition', 0, section='defaults'), 5))
  145.     if item.has_key('media_num') and item['media_num']:
  146.         w['discs'].set_value( gutils.digits_only(item['media_num']))
  147.     else:
  148.         w['discs'].set_value(1)
  149.     if item.has_key('rating') and item['rating']:
  150.         w['rating_slider'].set_value( gutils.digits_only(item['rating'], 10) )
  151.     else:
  152.         w['rating_slider'].set_value(0)
  153.     if item.has_key('seen') and item['seen'] is True:
  154.         w['seen'].set_active(True)
  155.     else:
  156.         w['seen'].set_active(False)
  157.     if item.has_key('cast') and item['cast']:
  158.         cast_buffer.set_text(item['cast'])
  159.     else:
  160.         cast_buffer.set_text('')
  161.     if item.has_key('notes') and item['notes']:
  162.         notes_buffer.set_text(item['notes'])
  163.     else:
  164.         notes_buffer.set_text('')
  165.     if item.has_key('plot') and item['plot']:
  166.         plot_buffer.set_text(item['plot'])
  167.     else:
  168.         plot_buffer.set_text('')
  169.     pos = 0
  170.     if item.has_key('medium_id') and item['medium_id']:
  171.         pos = gutils.findKey(item['medium_id'], self.media_ids)
  172.     else:
  173.         pos = gutils.findKey(int(self.config.get('media', 0, section='defaults')), self.media_ids)
  174.     if pos is not None:
  175.         w['media'].set_active(int(pos))
  176.     else:
  177.         w['media'].set_active(0)
  178.     pos = 0
  179.     if item.has_key('vcodec_id') and item['vcodec_id']:
  180.         pos = gutils.findKey(item['vcodec_id'], self.vcodecs_ids)
  181.     else:
  182.         pos = gutils.findKey(int(self.config.get('vcodec', 0, section='defaults')), self.vcodecs_ids)
  183.     if pos is not None:
  184.         w['vcodec'].set_active(int(pos))
  185.     else:
  186.         w['vcodec'].set_active(0)
  187.     pos = 0
  188.     if item.has_key('volume_id') and item['volume_id']:
  189.         pos = gutils.findKey(item['volume_id'], self.volume_combo_ids)
  190.     if pos is not None:
  191.         w['volume'].set_active(int(pos))
  192.     else:
  193.         w['volume'].set_active(0)
  194.     pos = 0
  195.     if item.has_key('collection_id') and item['collection_id']:
  196.         pos = gutils.findKey(item['collection_id'], self.collection_combo_ids)
  197.     if pos is not None:
  198.         w['collection'].set_active(int(pos))
  199.     else:
  200.         w['volume'].set_active(0)
  201.     # tags
  202.     for tag in self.am_tags:
  203.         self.am_tags[tag].set_active(False)
  204.     if item.has_key('tags'):
  205.         for tag in item['tags']:
  206.             i = gutils.findKey(tag.tag_id, self.tags_ids)
  207.             self.am_tags[i].set_active(True)
  208.     # languages
  209.     w['lang_treeview'].get_model().clear()
  210.     if item.has_key('languages') and len(item['languages'])>0:
  211.         for i in item['languages']:
  212.             self.create_language_row(i)
  213.     # poster
  214.     if item.has_key('image') and item['image']:
  215.         w['image'].set_text(item['image'])
  216.         image_path = os.path.join(self.locations['posters'], "m_%s.jpg" % item['image'])
  217.     else:
  218.         w['image'].set_text('')
  219.         image_path = os.path.join(self.locations['images'], 'default.png')
  220.     if not os.path.isfile(image_path):
  221.         image_path = os.path.join(self.locations['images'], 'default.png')
  222.     w['picture'].set_from_file(image_path)
  223.     
  224.     w['notebook'].set_current_page(0)
  225.     w['source'].set_active(self.d_plugin)
  226.     w['o_title'].grab_focus()
  227.     #}}}
  228.  
  229. def get_details(self): #{{{
  230.     w = self.widgets['add']
  231.     
  232.     cast_buffer  = w['cast'].get_buffer()
  233.     notes_buffer = w['notes'].get_buffer()
  234.     plot_buffer  = w['plot'].get_buffer()
  235.     
  236.     t_movies = {
  237.         'classification' : w['classification'].get_text().decode('utf-8'),
  238.         'color'          : w['color'].get_active(),
  239.         'cond'           : w['condition'].get_active(),
  240.         'country'        : w['country'].get_text().decode('utf-8'),
  241.         'director'       : w['director'].get_text().decode('utf-8'),
  242.         'genre'          : w['genre'].get_text().decode('utf-8'),
  243.         'image'          : w['image'].get_text().decode('utf-8'),
  244.         'layers'         : w['layers'].get_active(),
  245.         'media_num'      : w['discs'].get_value(),
  246.         'number'         : w['number'].get_value(),
  247.         'o_site'         : w['o_site'].get_text().decode('utf-8'),
  248.         'o_title'        : w['o_title'].get_text().decode('utf-8'),
  249.         'rating'         : w['rating_slider'].get_value(),
  250.         'region'         : w['region'].get_active(),
  251.         'runtime'        : w['runtime'].get_text().decode('utf-8'),
  252.         'site'           : w['site'].get_text().decode('utf-8'),
  253.         'studio'         : w['studio'].get_text().decode('utf-8'),
  254.         'title'          : w['title'].get_text().decode('utf-8'),
  255.         'trailer'        : w['trailer'].get_text().decode('utf-8'),
  256.         'year'           : w['year'].get_value(),
  257.         'collection_id'  : w['collection'].get_active(),
  258.         'medium_id'      : w['media'].get_active(),
  259.         'volume_id'      : w['volume'].get_active(),
  260.         'vcodec_id'      : w['vcodec'].get_active(),
  261.         'cast'           : cast_buffer.get_text(cast_buffer.get_start_iter(),cast_buffer.get_end_iter()).decode('utf-8'),
  262.         'notes'          : notes_buffer.get_text(notes_buffer.get_start_iter(),notes_buffer.get_end_iter()).decode('utf-8'),
  263.         'plot'           : plot_buffer.get_text(plot_buffer.get_start_iter(),plot_buffer.get_end_iter()).decode('utf-8'),
  264.     }
  265.     if self._am_movie_id is not None:
  266.         t_movies['movie_id'] = self._am_movie_id
  267.     
  268.     if t_movies['collection_id'] > 0:
  269.         t_movies['collection_id'] = self.collection_combo_ids[t_movies['collection_id']]
  270.     else:
  271.         t_movies['collection_id'] = None
  272.     if t_movies['volume_id'] > 0:
  273.         t_movies['volume_id'] = self.volume_combo_ids[t_movies['volume_id']]
  274.     else:
  275.         t_movies['volume_id'] = None
  276.     if t_movies['medium_id'] > 0:
  277.         t_movies['medium_id'] = self.media_ids[t_movies['medium_id']]
  278.     else:
  279.         t_movies['medium_id'] = None
  280.     if t_movies['vcodec_id'] > 0:
  281.         t_movies['vcodec_id'] = self.vcodecs_ids[t_movies['vcodec_id']]
  282.     else:
  283.         t_movies['vcodec_id'] = None
  284.     
  285.     if w['seen'].get_active():
  286.         t_movies['seen'] = True
  287.     else:
  288.         t_movies['seen'] = False
  289.     if t_movies['year'] < 1900:
  290.         t_movies['year'] = None
  291.  
  292.     def get_id(model, text):
  293.         for i in model:
  294.             if i[1] == text:
  295.                 return i[0]
  296.         return None
  297.     # languages
  298.     from sets import Set as set # for python2.3 compatibility
  299.     t_movies['languages'] = set()
  300.     for row in self.lang['model']:
  301.         lang_id   = get_id(self.lang['lang'], row[0])
  302.         lang_type = get_id(self.lang['type'], row[1])
  303.         acodec    = get_id(self.lang['acodec'], row[2])
  304.         achannel  = get_id(self.lang['achannel'], row[3])
  305.         subformat = get_id(self.lang['subformat'], row[4])
  306.         t_movies['languages'].add((lang_id, lang_type, acodec, achannel, subformat))
  307.  
  308.     # tags
  309.     t_movies['tags'] = {}
  310.     for i in self.tags_ids:
  311.         if self.am_tags[i].get_active() == True:
  312.             t_movies['tags'][self.tags_ids[i]] = 1
  313.     
  314.     validate_details(t_movies)
  315.  
  316.     return t_movies    #}}}
  317.  
  318. def validate_details(t_movies, allow_only=None):
  319.     for i in t_movies.keys():
  320.         if t_movies[i] == '':
  321.             t_movies[i] = None
  322.     for i in ['color','cond','layers','region', 'media', 'vcodec']:
  323.         if t_movies.has_key(i) and t_movies[i] < 1:
  324.             t_movies[i] = None
  325.     for i in ['volume_id','collection_id', 'runtime']:
  326.         if t_movies.has_key(i) and (t_movies[i] is None or int(t_movies[i]) == 0):
  327.             t_movies[i] = None
  328.     if allow_only is not None:
  329.         for i in t_movies:
  330.             if not i in allow_only:
  331.                 t_movies.pop(i)
  332.  
  333. def update_movie(self):
  334.     if self._am_movie_id is not None:
  335.         movie = self.db.Movie.get_by(movie_id=self._am_movie_id)
  336.     else:
  337.         movie = self.db.Movie.get_by(movie_id=self._movie_id)
  338.     if movie is None: # movie was deleted in the meantime
  339.         return add_movie_db(self, True)
  340.     old_image = movie.image
  341.     details = get_details(self)
  342.     if movie.update_in_db(details):
  343.         treeselection = self.widgets['treeview'].get_selection()
  344.         (tmp_model, tmp_iter) = treeselection.get_selected()
  345.         
  346.         if details['image'] and details['image'] != old_image:
  347.             # TODO: fetch poster from amazon / load from disk
  348.             image_path = os.path.join(self.locations['temp'], "poster_%s.jpg" % details['image'])
  349.             if os.path.isfile(image_path):
  350.                 # delete old image
  351.                 import delete
  352.                 delete.delete_poster(self, old_image)
  353.                 new_image_path = os.path.join(self.locations['posters'], "%s.jpg" % details['image'])
  354.                 shutil.move(image_path, new_image_path)
  355.                 #lets make the thumbnail and medium image from poster for future use
  356.                 gutils.make_thumbnail(self, "%s.jpg"%details['image'])
  357.                 gutils.make_medium_image(self, "%s.jpg"%details['image'])
  358.                 # update thumbnail in main list
  359.                 handler = self.Image.set_from_file(new_image_path)
  360.                 pixbuf = self.Image.get_pixbuf()
  361.                 tmp_model.set_value(tmp_iter,1, pixbuf.scale_simple(30,40,3))
  362.         # update main treelist
  363.         tmp_model.set_value(tmp_iter,0,'%004d' % int(movie.number))
  364.         tmp_model.set_value(tmp_iter,2, movie.o_title)
  365.         tmp_model.set_value(tmp_iter,3, movie.title)
  366.         tmp_model.set_value(tmp_iter,4, movie.director)
  367.         tmp_model.set_value(tmp_iter,5, movie.genre)
  368.         tmp_model.set_value(tmp_iter,6, movie.seen)
  369.         if movie.year is None:
  370.             tmp_model.set_value(tmp_iter,7, '')
  371.         else:
  372.             tmp_model.set_value(tmp_iter,7, movie.year)
  373.         if movie.runtime is None:
  374.             tmp_model.set_value(tmp_iter,8, '')
  375.         else:
  376.             tmp_model.set_value(tmp_iter,8, '%003d' % int(movie.runtime) + _(' min'))
  377.         if movie.rating is None:
  378.             tmp_model.set_value(tmp_iter,9, '')
  379.         else:
  380.             tmp_model.set_value(tmp_iter,9, movie.rating)
  381.         # close add window
  382.         self.widgets['add']['window'].hide()
  383.         # refresh
  384.         self.treeview_clicked()
  385.         self.update_statusbar(_('Movie information has been updated'))
  386.  
  387. def add_movie_db(self, close):
  388.     details = get_details(self)
  389.     if not details['o_title'] and not details['title']:
  390.         gutils.error(self.widgets['results']['window'], _("You should fill the original title\nor the movie title."), parent=self.widgets['add']['window'])
  391.         return False
  392.  
  393.     if details['o_title']:
  394.         tmp_movie = self.db.Movie.get_by(o_title=details['o_title'])
  395.         if tmp_movie is not None:
  396.             response = gutils.question(self, msg=_('Movie with that title already exists, are you sure you want to add?'), cancel=0, parent=self.widgets['add']['window'])
  397.             if response == gtk.RESPONSE_NO:
  398.                 return False
  399.     if details['title']:
  400.         tmp_movie = self.db.Movie.get_by(title=details['title'])
  401.         if tmp_movie is not None:
  402.             response = gutils.question(self, msg=_('Movie with that title already exists, are you sure you want to add?'), cancel=0, parent=self.widgets['add']['window'])
  403.             if response == gtk.RESPONSE_NO:
  404.                 return False
  405.  
  406.     movie = self.db.Movie()
  407.     if not movie.add_to_db(details):
  408.         return False
  409.  
  410.     # lets move poster from tmp to posters dir
  411.     tmp_dest = self.locations['posters']
  412.  
  413.     image_path = ''
  414.     if details['image']:
  415.         tmp_image_path = os.path.join(self.locations['temp'], "poster_%s.jpg" % details['image'])
  416.         if os.path.isfile(tmp_image_path):
  417.             image_path = os.path.join(tmp_dest, "%s.jpg" % details['image'])
  418.             shutil.move(tmp_image_path, image_path)
  419.             #lets make the thumbnail and medium image from poster for future use
  420.             gutils.make_thumbnail(self, "%s.jpg"%details['image'])
  421.             gutils.make_medium_image(self, "%s.jpg"%details['image'])
  422.  
  423.     rows = len(self.treemodel)
  424.     if rows>0:
  425.         insert_after = self.treemodel.get_iter(rows-1)    # last
  426.     else:
  427.         insert_after = None
  428.     myiter = self.treemodel.insert_after(None, insert_after)
  429.  
  430.     if not os.path.isfile(image_path):
  431.         image_path = os.path.join(self.locations['images'], 'default.png')
  432.     handler = self.Image.set_from_file(image_path)
  433.     pixbuf = self.Image.get_pixbuf()
  434.     self.treemodel.set_value(myiter, 0, '%004d' % details['number'])
  435.     self.treemodel.set_value(myiter, 1, pixbuf.scale_simple(30,40,3))
  436.     self.treemodel.set_value(myiter, 2, details['o_title'])
  437.     self.treemodel.set_value(myiter, 3, details['title'])
  438.     self.treemodel.set_value(myiter, 4, details['director'])
  439.     self.treemodel.set_value(myiter, 5, details['genre'])
  440.     self.treemodel.set_value(myiter, 6, details['seen'])
  441.     if details['year'] is None:
  442.         self.treemodel.set_value(myiter, 7, '')
  443.     else:
  444.         self.treemodel.set_value(myiter, 7, details['year'])
  445.     if details['runtime'] is None:
  446.         self.treemodel.set_value(myiter, 8, '')
  447.     else:
  448.         self.treemodel.set_value(myiter, 8, '%003d' % int(details['runtime']) + _(' min'))
  449.     if details['rating'] is None:
  450.         self.treemodel.set_value(myiter, 9, '')
  451.     else:
  452.         self.treemodel.set_value(myiter, 9, details['rating'])
  453.     #update statusbar
  454.     self.total += 1
  455.     self.count_statusbar()
  456.     #select new entry from main treelist
  457.     self.widgets['treeview'].get_selection().select_iter(myiter)
  458.     self.treeview_clicked()
  459.     clear(self)
  460.  
  461.     if close:
  462.         self.hide_add_window()
  463.  
  464. def change_rating_from_slider(self):
  465.     rating = int(self.widgets['add']['rating_slider'].get_value())
  466.     self.widgets['add']['image_rating'].show()
  467.     try:
  468.         rimage = int(str(self.config.get('rating_image')))
  469.     except:
  470.         rimage = 0
  471.     if rimage:
  472.         prefix = ''
  473.     else:
  474.         prefix = "meter"
  475.     rating_file = "%s/%s0%d.png" % (self.locations['images'], prefix, rating)
  476.     handler = self.widgets['add']['image_rating'].set_from_pixbuf(gtk.gdk.pixbuf_new_from_file(rating_file))
  477.  
  478. def populate_with_results(self):
  479.     w = self.widgets['add']
  480.     m_id = None
  481.     if self.founded_results_id:
  482.         self.debug.show("self.founded:results_id: %s" % self.founded_results_id)
  483.         m_id = self.founded_results_id
  484.     else:
  485.         self.founded_results_id = 0
  486.         treeselection = self.widgets['results']['treeview'].get_selection()
  487.         (tmp_model, tmp_iter) = treeselection.get_selected()
  488.         if tmp_iter is None:
  489.             return False
  490.         m_id = tmp_model.get_value(tmp_iter, 0)
  491.     
  492.     self.treemodel_results.clear()
  493.     self.widgets['results']['window'].hide()
  494.  
  495.     plugin_name = 'PluginMovie' + self.active_plugin
  496.     plugin = __import__(plugin_name)
  497.     self.movie = plugin.Plugin(m_id)
  498.     self.movie.locations = self.locations
  499.     self.movie.debug = self.debug
  500.     self.movie.config = self.config
  501.     
  502.     fields_to_fetch = ['o_title', 'title', 'director', 'plot', 'cast', 'country', 'genre',
  503.                 'classification', 'studio', 'o_site', 'site', 'trailer', 'year',
  504.                 'notes', 'runtime', 'image', 'rating']
  505.     # remove fields that user doesn't want to fetch: (see preferences window)
  506.     fields_to_fetch = [ i for i in fields_to_fetch if self.config.get("s_%s" % i, True, section='add') ]
  507.  
  508.     if w['cb_only_empty'].get_active(): # only empty fields
  509.         details = get_details(self)
  510.         fields_to_fetch = [ i for i in fields_to_fetch if details[i] is None ]
  511.     self.movie.fields_to_fetch = fields_to_fetch
  512.     
  513.     self.movie.get_movie(w['window'])
  514.     self.movie.parse_movie()
  515.  
  516.     if 'year' in fields_to_fetch:
  517.         w['year'].set_value(int(self.movie.year))
  518.         fields_to_fetch.pop(fields_to_fetch.index('year'))
  519.     if 'runtime' in fields_to_fetch:
  520.         w['runtime'].set_value(int(self.movie.runtime))
  521.         fields_to_fetch.pop(fields_to_fetch.index('runtime'))
  522.     if 'cast' in fields_to_fetch:
  523.         cast_buffer = w['cast'].get_buffer()
  524.         cast_buffer.set_text(gutils.convert_entities(self.movie.cast))
  525.         fields_to_fetch.pop(fields_to_fetch.index('cast'))
  526.     if 'plot' in fields_to_fetch:
  527.         plot_buffer = w['plot'].get_buffer()
  528.         plot_buffer.set_text(gutils.convert_entities(self.movie.plot))
  529.         fields_to_fetch.pop(fields_to_fetch.index('plot'))
  530.     if 'notes' in fields_to_fetch:
  531.         notes_buffer = w['notes'].get_buffer()
  532.         notes_buffer.set_text(gutils.convert_entities(self.movie.notes))
  533.         fields_to_fetch.pop(fields_to_fetch.index('notes'))
  534.     if 'rating' in fields_to_fetch:
  535.         if self.movie.rating:
  536.             w['rating_slider'].set_value(float(self.movie.rating))
  537.         fields_to_fetch.pop(fields_to_fetch.index('rating'))
  538.     # poster
  539.     if 'image' in fields_to_fetch:
  540.         if self.movie.image:
  541.             image = os.path.join(self.locations['temp'], "poster_%s.jpg" % self.movie.image)
  542.             try:
  543.                 handler = self.Image.set_from_file(image)
  544.                 pixbuf = self.Image.get_pixbuf()
  545.                 w['picture'].set_from_pixbuf(pixbuf.scale_simple(100, 140, 3))
  546.                 w['image'].set_text(self.movie.image)
  547.             except:
  548.                 image = os.path.join(self.locations['images'], 'default.png')
  549.                 handler = self.Image.set_from_file(image)
  550.                 w['picture'].set_from_pixbuf(self.Image.get_pixbuf())
  551.         else:
  552.             image = os.path.join(self.locations['images'], 'default.png')
  553.             handler = self.Image.set_from_file(image)
  554.             Pixbuf = self.Image.get_pixbuf()
  555.             w['picture'].set_from_pixbuf(Pixbuf)
  556.         fields_to_fetch.pop(fields_to_fetch.index('image'))
  557.     # other fields
  558.     for i in fields_to_fetch:
  559.         w[i].set_text(gutils.convert_entities(self.movie[i]))
  560.  
  561. def show_websearch_results(self):
  562.     total = self.founded_results_id = 0
  563.     for g in self.search_movie.ids:
  564.         if ( str(g) != '' ):
  565.             total += 1
  566.     if total > 1:
  567.         self.widgets['results']['window'].show()
  568.         self.widgets['results']['window'].set_keep_above(True)
  569.         row = None    
  570.         key = 0
  571.         self.treemodel_results.clear()
  572.         for row in self.search_movie.ids:
  573.             if (str(row)!=''):
  574.                 title = str(self.search_movie.titles[key]).decode(self.search_movie.encode)
  575.                 myiter = self.treemodel_results.insert_before(None, None)
  576.                 self.treemodel_results.set_value(myiter, 0, str(row))
  577.                 self.treemodel_results.set_value(myiter, 1, title)
  578.             key +=1
  579.         self.widgets['results']['treeview'].show()
  580.     elif total==1:
  581.         self.widgets['results']['treeview'].set_cursor(total-1)
  582.         for row in self.search_movie.ids:
  583.             if ( str(row) != '' ):
  584.                 self.founded_results_id = str(row)
  585.                 populate_with_results(self)
  586.     else:
  587.         gutils.error(self.widgets['results']['window'], _("No results"), self.widgets['add']['window'])
  588.  
  589. def get_from_web(self):
  590.     """search the movie in web using the active plugin"""
  591.     title = self.widgets['add']['title'].get_text()
  592.     o_title = self.widgets['add']['o_title'].get_text()
  593.  
  594.     if o_title or title:
  595.         option = gutils.on_combo_box_entry_changed_name(self.widgets['add']['source'])
  596.         self.active_plugin = option
  597.         plugin_name = 'PluginMovie%s' % option
  598.         plugin = __import__(plugin_name)
  599.         self.search_movie = plugin.SearchPlugin()
  600.         self.search_movie.debug = self.debug
  601.         self.search_movie.config = self.config
  602.         if o_title:
  603.             self.search_movie.url = self.search_movie.original_url_search
  604.             if self.search_movie.remove_accents:
  605.                 self.search_movie.title = gutils.remove_accents(o_title, 'utf-8')
  606.             else:
  607.                 self.search_movie.title = unicode(o_title, 'utf-8')
  608.         elif title:
  609.             self.search_movie.url = self.search_movie.translated_url_search
  610.             if self.search_movie.remove_accents:
  611.                 self.search_movie.title = gutils.remove_accents(title, 'utf-8')
  612.             else:
  613.                 self.search_movie.title = unicode(title, 'utf-8')
  614.         self.search_movie.search_movies(self.widgets['add']['window'])
  615.         self.search_movie.get_searches()
  616.         if len(self.search_movie.ids) == 1 and o_title and title:
  617.             self.search_movie.url = self.search_movie.translated_url_search
  618.             if self.search_movie.remove_accents:
  619.                 self.search_movie.title = gutils.remove_accents(title, 'utf-8')
  620.             else:
  621.                 self.search_movie.title = unicode(title, 'utf-8')
  622.             self.search_movie.search_movies(self.widgets['add']['window'])
  623.             self.search_movie.get_searches()
  624.         self.show_search_results(self.search_movie)
  625.     else:
  626.         gutils.error(self.widgets['results']['window'], \
  627.             _("You should fill the original title\nor the movie title."))
  628.  
  629. def source_changed(self):
  630.     option = gutils.on_combo_box_entry_changed_name(self.widgets['add']['source'])
  631.     self.active_plugin = option
  632.     plugin_name = 'PluginMovie' + option
  633.     plugin = __import__(plugin_name)
  634.     self.widgets['add']['plugin_desc'].set_text(plugin.plugin_name+"\n" \
  635.         +plugin.plugin_description+"\n"+_("Url: ") \
  636.         +plugin.plugin_url+"\n"+_("Language: ")+plugin.plugin_language)
  637.     image = os.path.join(self.locations['images'], plugin_name + ".png")
  638.     # if movie plugin logo exists lets use it
  639.     if os.path.exists(image):
  640.         handler = self.widgets['add']['plugin_image'].set_from_pixbuf(gtk.gdk.pixbuf_new_from_file(image))
  641.  
  642. def clone_movie(self):
  643.     treeselection = self.widgets['treeview'].get_selection()
  644.     (tmp_model, tmp_iter) = treeselection.get_selected()
  645.     if tmp_iter is None:
  646.         return False
  647.     number = tmp_model.get_value(tmp_iter, 0)
  648.     movie = self.db.Movie.get_by(number=number)
  649.  
  650.     if movie is None:
  651.         return False
  652.  
  653.     next_number = gutils.find_next_available(self.db)
  654.     if movie.image is not None:
  655.         new_image = str(movie.image) + '_' + str(next_number)
  656.     else:
  657.         new_image = None
  658.     
  659.     # integer problem workaround
  660.     if int(movie.seen)==1:
  661.         seen = True
  662.     else:
  663.         seen = False
  664.     new_movie = self.db.Movie()
  665.     
  666.     new_movie.cast = movie.cast
  667.     new_movie.classification = movie.classification
  668.     new_movie.vcodec_id = movie.vcodec_id
  669.     new_movie.collection_id = movie.collection_id
  670.     new_movie.volume_id = movie.volume_id
  671.     new_movie.color = movie.color
  672.     new_movie.cond = movie.cond
  673.     new_movie.country = movie.country
  674.     new_movie.director = movie.director
  675.     new_movie.genre = movie.genre
  676.     new_movie.image = new_image
  677.     new_movie.site = movie.site
  678.     new_movie.loaned = movie.loaned
  679.     new_movie.layers = movie.layers
  680.     new_movie.medium_id = movie.medium_id
  681.     new_movie.number = next_number
  682.     new_movie.media_num = movie.media_num
  683.     new_movie.notes = movie.notes
  684.     new_movie.o_title = movie.o_title
  685.     new_movie.plot = movie.plot
  686.     new_movie.rating = movie.rating
  687.     new_movie.region = movie.region
  688.     new_movie.runtime = movie.runtime
  689.     new_movie.seen = seen
  690.     new_movie.o_site = movie.o_site
  691.     new_movie.studio = movie.studio
  692.     new_movie.title = movie.title
  693.     new_movie.trailer = movie.trailer
  694.     new_movie.year = movie.year
  695.     
  696.     new_movie.tags = movie.tags
  697.     new_movie.languages = movie.languages
  698.     new_movie.loans = movie.loans
  699.     
  700.     # save
  701.     new_movie.save()
  702.     new_movie.flush()
  703.  
  704.     # WARNING: loan problems (don't copy volume/collection data until resolved)
  705.  
  706.     tmp_dest = self.locations['posters']
  707.     if movie.image is not None:
  708.         image_path = os.path.join(tmp_dest, str(movie.image)+".jpg")
  709.         clone_path = os.path.join(tmp_dest, new_image+".jpg")
  710.         # clone image
  711.         # catch IOError otherwise you would not see the cloned entry in
  712.         # the list before the next start of griffith or another refresh
  713.         # of the list
  714.         try:
  715.             shutil.copyfile(image_path, clone_path)
  716.             image_path = clone_path
  717.             gutils.make_thumbnail(self, "%s.jpg" % new_image)
  718.             gutils.make_medium_image(self, "%s.jpg" % new_image)
  719.         except IOError:
  720.             image_path = os.path.join(self.locations['images'], "default.png")
  721.     else:
  722.         image_path = os.path.join(self.locations['images'], "default.png")
  723.     handler = self.Image.set_from_file(image_path)
  724.  
  725.     # change_filter calls populate_treeview which updates the status bar
  726.     quick_filter.change_filter(self)
  727.  
  728. # vim: fdm=marker
  729.